package br.com.rglariguet.pioneer.controller.adm;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.rglariguet.pioneer.controller.ControllerComum;
import br.com.rglariguet.pioneer.dao.AutorizadaDAO;
import br.com.rglariguet.pioneer.dao.PerfilDAO;
import br.com.rglariguet.pioneer.dao.UsuarioDAO;
import br.com.rglariguet.pioneer.enums.TipoUsuarioEnum;
import br.com.rglariguet.pioneer.modelos.Autorizada;
import br.com.rglariguet.pioneer.modelos.Perfil;
import br.com.rglariguet.pioneer.modelos.Usuario;

@Controller()
@RequestMapping("/seguro/adm/")
public class UsuarioController extends ControllerComum{

	@Autowired
	private AutorizadaDAO autorizadaDao;

	@Autowired
	private UsuarioDAO usuarioDao;
	
	@Autowired
	private PerfilDAO perfilDao;
	
	
	
	
	private Autorizada autorizada = new Autorizada();
	
	@ModelAttribute("autorizada")
	public Autorizada getAutorizada() {
		return this.autorizada;
	}
	
	public void setAutorizada(Autorizada autorizada) {
		this.autorizada = autorizada;
	}
	
	@RequestMapping("cadastroDeUsuariosAdm")
	public ModelAndView abreTelaCadastroDeUsuariosASCAdm(){
		ModelAndView mv = new ModelAndView("/seguro/adm/cadastroDeUsuariosAdm");
		
		mv.addObject("autorizada", new Autorizada());
		mv.addObject("autorizadas", autorizadaDao.listarTodos());
		mv.addObject("tiposUsuarios", Arrays.asList(TipoUsuarioEnum.values()));
		
		return mv;
	}	

	@RequestMapping("recarregaListaDeAutorizadas")
	public ModelAndView recarregaListaDeAutorizadas(Autorizada autorizada){
		ModelAndView mv = new ModelAndView("/seguro/adm/cadastroDeUsuariosAdm");
		
		setAutorizada(autorizada);
		ArrayList<Autorizada> autorizadas = autorizadaDao.buscaPorTipo(autorizada.getUsuario().getTipoUsuario());
		Autorizada autorizadaLimpa = new Autorizada();
		autorizadaLimpa.getUsuario().setTipoUsuario(getAutorizada().getUsuario().getTipoUsuario());
		setAutorizada(autorizadaLimpa);
		
		if (autorizada.getUsuario().getTipoUsuario() == null || autorizada.getUsuario().getTipoUsuario() == TipoUsuarioEnum.ADMIN) {
			List<Usuario> usuariosAdmin = usuarioDao.listarTodosPorTipo(TipoUsuarioEnum.ADMIN);
			for (Usuario usuario : usuariosAdmin) {
				Autorizada aut = new Autorizada();
				aut.setNomeAutorizada(usuario.getNome());
				autorizadas.add(aut);
			}
		}
			
		mv.addObject("autorizada", getAutorizada());
		mv.addObject("autorizadas", autorizadas);
		mv.addObject("tiposUsuarios", Arrays.asList(TipoUsuarioEnum.values()));
		
		return mv;
	}	
	
	@RequestMapping("atualizaAutorizada")
	public ModelAndView atualizaAutorizada(Autorizada autorizada){
		ModelAndView mv = new ModelAndView("/seguro/adm/cadastroDeUsuariosAdm");
		Autorizada autorizadaPreenchida = null;
		if (autorizada.getUsuario().getTipoUsuario() == TipoUsuarioEnum.ADMIN) {
			Usuario buscaPreenchido = usuarioDao.buscaPorNome(autorizada.getNomeAutorizada());
			autorizadaPreenchida = new Autorizada();
			autorizadaPreenchida.setNomeAutorizada(autorizada.getNomeAutorizada());
			autorizadaPreenchida.setUsuario(buscaPreenchido);
		}else{
			autorizadaPreenchida = autorizadaDao.buscaPorNome(autorizada.getNomeAutorizada());
		}
		
		if (autorizadaPreenchida != null) {
			setAutorizada(autorizadaPreenchida);
		}else{
			Autorizada autorizadaLimpa = new Autorizada();
			autorizadaLimpa.getUsuario().setTipoUsuario(getAutorizada().getUsuario().getTipoUsuario());
			setAutorizada(autorizadaLimpa);
		}
		
		ArrayList<Autorizada> autorizadas = autorizadaDao.buscaPorTipo(autorizada.getUsuario().getTipoUsuario());
		
		if (autorizada.getUsuario().getTipoUsuario() == null || autorizada.getUsuario().getTipoUsuario() == TipoUsuarioEnum.ADMIN) {
			Autorizada autorizadaLimpa = new Autorizada();
			autorizadaLimpa.getUsuario().setTipoUsuario(autorizada.getUsuario().getTipoUsuario());
			List<Usuario> usuariosAdmin = usuarioDao.listarTodosPorTipo(TipoUsuarioEnum.ADMIN);
			for (Usuario usuario : usuariosAdmin) {
				Autorizada aut = new Autorizada();
				aut.setNomeAutorizada(usuario.getNome());
				autorizadas.add(aut);
			}
		}
		
		
		mv.addObject("autorizadas", autorizadas);
		mv.addObject("autorizada", getAutorizada());
		mv.addObject("tiposUsuarios", Arrays.asList(TipoUsuarioEnum.values()));
		
		return mv;
	}	
	
	
	@RequestMapping("gravarUsuario")
	public ModelAndView gravarUsuario(@Valid Autorizada autorizada, BindingResult br){
		ModelAndView mv = new ModelAndView("/seguro/adm/cadastroDeUsuariosAdm");
		
		if (br.hasErrors()) {
			mv.addObject("msg", criaMsgErro("usuario.salvo.erro"));
			mv.addObject("autorizadas", autorizadaDao.buscaPorTipo(autorizada.getUsuario().getTipoUsuario()));
			mv.addObject("autorizada", getAutorizada());
			mv.addObject("tiposUsuarios", Arrays.asList(TipoUsuarioEnum.values()));
			return mv;
		}
		
		Usuario usuario = autorizada.getUsuario();
		List<Perfil> perfis = new ArrayList<Perfil>();
		Perfil perfil = perfilDao.buscaPorNome(usuario.getTipoUsuario().getRole());
		perfis.add(perfil);
		usuario.setPerfis(perfis);
		
		if (usuario.getTipoUsuario() == TipoUsuarioEnum.ADMIN) {
			usuarioDao.salvar(usuario);
		}else{
			usuarioDao.alterar(usuario);
		}
		
		mv.addObject("autorizadas", autorizadaDao.buscaPorTipo(autorizada.getUsuario().getTipoUsuario()));
		mv.addObject("autorizada", new Autorizada());
		mv.addObject("tiposUsuarios", Arrays.asList(TipoUsuarioEnum.values()));
		mv.addObject("msg", criaMsgSucesso("usuario.salvo.sucesso"));
		return mv;
	}	
	
	class PossivelUsuario{
		
	}
	
}
